package com.yanyeori.framework.datasource.util;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.yanyeori.framework.core.model.PageParam;
import com.yanyeori.framework.core.util.BeanUtil;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * Page分页工具
 *
 * @author chenkuan 2022/8/25
 */
public class PageUtil {
    /**
     * 使用分页参数分页查询
     *
     * @param pageNum  页码
     * @param pageSize 每页显示记录数
     */
    public static <E> Page<E> startPage(int pageNum, int pageSize) {
        return PageHelper.startPage(pageNum, pageSize);
    }

    /**
     * 使用PageParam分页参数分页查询
     *
     * @param pageParam 分页参数
     */
    public static <E> Page<E> startPage(PageParam pageParam) {
        Page<E> page = PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize(), pageParam.getOrderBy());
        page.setReasonable(pageParam.getReasonable());
        return page;
    }

    /**
     * 使用HttpServletRequest分页参数分页查询
     */
    public static <E> Page<E> startPage() {
        return startPage(PageParam.buildRequestPage());
    }

    /**
     * 清理分页的线程变量
     */
    public static void clearPage() {
        PageHelper.clearPage();
    }

    /**
     * 将分页查询的List转换为目标List，且包含分页信息
     * 此方法会清空源List
     *
     * @param pList       分页源List
     * @param targetClass 目标List对象
     */
    public static <P, R> List<R> convert(List<P> pList, Class<R> targetClass) {
        if (CollectionUtils.isEmpty(pList)) {
            return (pList instanceof Page) ? (Page<R>) pList : new ArrayList<>();
        }
        List<R> rList = BeanUtil.copyToList(pList, targetClass);
        if (pList instanceof Page) {
            pList.clear();
            Page<R> rPage = (Page<R>) pList;
            rPage.addAll(rList);
            return rPage;
        } else {
            return rList;
        }
    }
}
